import {UserService} from '#src/module/user/service/UserService.js';
import {AppError as ApiError} from '#src/common/errors/index.js';
import {logger} from '#src/common/utils/logger.js';
import {AuthMessage} from '#src/constants/message.constants.js';
import {HTTP_STATUS} from '#src/constants/http.constants.js';
import {ResponseHandler} from '#src/common/utils/http/responseHandler.js';
import jwtService from "#src/common/services/auth/JwtService.js";

// 创建 UserService 实例
const userService = new UserService();

/**
 * 用户控制器类，处理用户注册、登录、信息获取和退出登录等请求
 * @class UserController
 * @module UserModule
 */
export const UserController = {
    /**
     * 用户注册接口
     * @async
     * @param {Request} req - Express请求对象，包含用户注册信息
     * @param {Response} res - Express响应对象
     * @param {NextFunction} next - Express next函数，用于错误传递
     * @returns {Promise<void>} - 返回JSON格式的注册结果
     * @throws {ApiError} - 当注册过程中发生错误时抛出
     */
    register: async (req, res, next) => {
        try {
            const result = await userService.register(req);  // 传递整个 req 对象
            res.json(result);
        } catch (error) {
            next(error);
        }
    },

    /**
     * 用户登录接口
     * @async
     * @param {Request} req - Express请求对象，包含邮箱和密码
     * @param {Response} res - Express响应对象
     * @param {NextFunction} next - Express next函数，用于错误传递
     * @returns {Promise<void>} - 返回JSON格式的登录结果，包含JWT令牌
     * @throws {ApiError} - 当认证失败或发生错误时抛出
     */
    login: async (req, res, next) => {
        try {
            // 从请求体获取邮箱和密码（而非URL参数）
            const {email, password} = req.body;
            const result = await userService.login({email, password});
            res.json(result);
        } catch (error) {
            next(error);
        }
    },
    /**
     * 获取用户信息接口
     * @async
     * @param {Request} req - Express请求对象，包含用户ID参数
     * @param {Response} res - Express响应对象
     * @param {NextFunction} next - Express next函数，用于错误传递
     * @returns {Promise<void>} - 返回JSON格式的用户信息
     * @throws {ApiError} - 当获取用户信息失败时抛出500错误
     * @note 当前实现存在错误：错误调用了login方法而非getUser方法
     */
    getUser: async (req, res, next) => {
         try {
            const result = await userService.getUser(req.query.id); 
            // 移除密码字段
            const { password, ...userWithoutPassword } = result;
            res.json(userWithoutPassword);
        } catch (error) {
            logger.error(`Error in getUser: ${error.message}`, {
                userId: req.params.id,
                error: error.stack
            });
            next(new ApiError('Failed to get user', 500, {
                userId: req.params.id
            }));
        }
    } ,

    /**
     * 用户退出登录接口
     * @async
     * @param {Request} req - Express请求对象，包含Authorization头
     * @param {Response} res - Express响应对象
     * @param {NextFunction} next - Express next函数，用于错误传递
     * @returns {Promise<void>} - 返回成功退出登录的响应
     * @throws {ApiError} - 当处理令牌过程中发生错误时抛出
     */
    logout: async (req, res, next) => {
        try {
            const authHeader = req.headers.authorization;
            const token = authHeader?.split(' ')[1];

            if (token) {
                const decoded = jwtService.decodeToken(token);
                // 计算剩余过期时间（秒）
                const expiresIn = decoded.exp - Math.floor(Date.now() / 1000);
                await jwtService.blacklistToken(token, expiresIn);
            }
            return res.status(HTTP_STATUS.OK)
                .json(ResponseHandler.success(null, AuthMessage.LOGOUT_SUCCESS));
        } catch (error) {
            next(error);
        }
    }
};
